package com.hb.A_基础.B_高阶函数和lambda

/**
 * 我们知道，函数参数化是一种十分强大的特性，结合lambda表达式，能在很大程度上提高
 * 语言的抽象表达能力。接下来来了解高阶函数在kotlin中的另一方面的表现，即一个函数返回
 * 另一个函数作为结果。
 */
fun main() {
    println(foo(1)(2))

    println(sum1(1)(2)(3))
}

//不写返回值会进行类型推断
/**
 * 现在有了函数类型信息之后，可以清楚的发现，
 * 执行foo函数之后，会返回另一个类型为(Int)->Int的函数
 *
 * 柯里化：
 *  简单来说，柯里化就是把接收多个参数的函数变换成一系列仅接收单一参数函数的过程，
 *  在返回最终结果值之前，前面的函数一次接收单个参数，然后返回下一个新的函数。
 */
fun foo(x:Int)={
    y:Int -> x+y
}

//foo等价于bar
fun bar(x:Int):(Int)->Int{
    return {
        y:Int->x+y
    }
}


fun sum(x:Int,y:Int,z:Int)=x+y+z
//柯里化 将上面的sum函数进行柯里化
/**
 * 在这个过程中：
 *  1. 开始的暗号就是第一个参数
 *  2. 下一个环节的演绎就是返回的函数
 *  3. 谜底就是科利华后最终执行获得的结果
 */
fun sum1(x:Int)={
    y:Int->{
        z:Int->x+y+z
}
}